package com.neu.cloudFactory.service;

import com.neu.cloudFactory.DAO.EquipMsgDAO;
import com.neu.cloudFactory.DAO.EquipTypeDAO;
import com.neu.cloudFactory.DAO.FactoryDAO;
import com.neu.cloudFactory.DAO.UserDAO;
import com.neu.cloudFactory.PO.EquipMsg;
import com.neu.cloudFactory.PO.EquipType;
import com.neu.cloudFactory.PO.ProductMsg;
import com.neu.cloudFactory.VO.EquipMsgVO;
import com.neu.cloudFactory.VO.EquipTypeVO;
import com.neu.cloudFactory.VO.ProductMsgVO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Service
@Transactional(rollbackFor = Exception.class)
public class EquipService {
    final EquipMsgDAO equipMsgDAO;
    final EquipTypeDAO equipTypeDAO;
    final FactoryDAO factoryDAO;
    final UserDAO userDAO;
    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

    public EquipService(EquipMsgDAO equipMsgDAO, EquipTypeDAO equipTypeDAO, FactoryDAO factoryDAO, UserDAO userDAO) {
        this.equipMsgDAO = equipMsgDAO;
        this.equipTypeDAO = equipTypeDAO;
        this.factoryDAO = factoryDAO;
        this.userDAO = userDAO;
    }

    public boolean isExist(EquipMsg equipMsg){
        return equipMsgDAO.findByName(equipMsg.getName()).size()!=0;
    }
    public void saveEquip(EquipMsg equipMsg){//新增设备
        equipMsgDAO.save(equipMsg);
    }
    public void saveEquipType(EquipType equipType){
        equipTypeDAO.save(equipType);
    }

    public List<EquipMsgVO> findAllEquipVO(){//列出所有设备
        List<EquipMsg> equipMsgList = equipMsgDAO.findAll();
        List<EquipMsgVO> equipMsgVOList = new ArrayList<>();
        for(EquipMsg equipMsg:equipMsgList){
            equipMsgVOList.add(
                    new EquipMsgVO(equipMsg,
                            factoryDAO.getById(equipMsg.getFactory()),
                            equipTypeDAO.getById(equipMsg.getTypeId()),
                            userDAO.getById(factoryDAO.getById(equipMsg.getFactory()).getUserId()).getAccount()));
        }
        return equipMsgVOList;
    }

    public List<EquipMsgVO> findAllEquipVO(int factoryId){//列出对应工厂下的所有设备
        List<EquipMsg> equipMsgList = equipMsgDAO.findAll();
        List<EquipMsgVO> equipMsgVOList = new ArrayList<>();
        for(EquipMsg equipMsg:equipMsgList){
            if(equipMsg.getFactory()==factoryId){
                equipMsgVOList.add(
                        new EquipMsgVO(equipMsg,
                                factoryDAO.getById(factoryId),
                                equipTypeDAO.getById(equipMsg.getTypeId()),
                                userDAO.getById(factoryDAO.getById(factoryId).getUserId()).getAccount()
                                ));
            }
        }
        return equipMsgVOList;
    }

    public List<EquipTypeVO> findAllEquipTypeVO(){//列出所有设备类型
        return equipTypeDAO.findAll().stream().map(EquipTypeVO::new).collect(Collectors.toList());
    }

    //删除
    public void deleteEquipMsg(int id){
        equipMsgDAO.deleteById(id);
    }
    public void deleteEquipType(EquipType equipType){
        equipTypeDAO.delete(equipType);
    }
    //类型是否被占用
    public boolean isOccupied(EquipType equipType){
        return equipMsgDAO.findByTypeId(equipType.getId()).size()!=0;
    }
    //设备是否被租用
    public boolean isRented(EquipMsg equipMsg){
        return equipMsg.getRentState().equals("已被租用");
    }
    //设备开机
    public void openEquip(EquipMsg equipMsg){
        equipMsgDAO.modifyRunState("闲置中",equipMsg.getId());
    }
    //设备关机
    public void closeEquip(EquipMsg equipMsg){
        equipMsgDAO.modifyRunState("已关闭",equipMsg.getId());
    }

    public EquipType findEquipTypeById(int id){
       return equipTypeDAO.getById(id);
    }

    public EquipMsg changeType(EquipMsgVO equipMsgVO){
        EquipMsg equipMsg  = new EquipMsg();
        equipMsg.setName(equipMsgVO.getName());
        equipMsg.setCode(equipMsgVO.getCode());
        equipMsg.setTypeId(equipTypeDAO.findByName(equipMsgVO.getType()).getId());
        equipMsg.setDetail(equipMsgVO.getDetail());
        equipMsg.setFactory(factoryDAO.findByUserId(userDAO.findByAccount(equipMsgVO.getUserAccount()).getId()).getId());
        equipMsg.setRentState(equipMsgVO.getRentState());
        equipMsg.setRunState(equipMsgVO.getEquipState());
        equipMsg.setSource(equipMsgVO.getSource());
        return equipMsg;
    }

    public EquipMsgVO addIdToEquip(EquipMsg equipMsg, String userAccount){//将id添加到要返回的VO上
        EquipMsg equipWithId = equipMsgDAO.findByName(equipMsg.getName()).get(0);
        return new EquipMsgVO(
                equipWithId,
                factoryDAO.getById(equipWithId.getFactory()),
                equipTypeDAO.getById(equipWithId.getTypeId()),
                userAccount);
    }

    public List<EquipMsg>findEquipById(int id){
        return equipMsgDAO.findByTypeId(id);
    }

    //自动生成编号
    public String generateCode() {
        Date date = new Date();
        return "EQ" + sdf.format(date);
    }



}
